![goffee logo](https://git.smarteching.com/avatars/cd7cd5b690adc8e5ec6d6cdb117f1bf5a9e9353dae111bfbb394d2c3d4497537?size=200)
# Cup of Goffee

## What is Goffee?
Cup is a skeleton project for the Goffee  [Go](https://go.dev) framework made for building web APIs, suitable for small, medium size and microservices projects. With it's simple structure, and developer friendly experience it helps with increasing the productivity.

## Main Features 
- Routing
- Hooks
- Data Validation
- Databases ORM ([GORM](https://gorm.io/) integrated)
- Emails
- JWT tokens
- Cache (Redis)
- HTTPS (TLS)

## Installation
To create a new `cup` project you need to install the `Goffee's cli` first

##### Install Goffee  [cli] tool
To install the `goffee` globally open up your terminal and run the following command:
```bash
go install git.smarteching.com/goffee/goffee@latest
```


##### Create new project using a Cup of Goffee
Here is how you can create new `Goffee` projects
```bash
goffee new [project-name] [project-remote-repository]
```
Example
```bash
goffee new myapp git.smarteching.com/goffee/myapp
```
where:
`project-name` is the name of your project
`remote-repository` is the remote repository that will host the project.

## Getting started
First make sure you have [Goffee](https://git.smarteching.com/goffee/goffee) installed, then use it to create a new project, [here is how](https://git.smarteching.com/goffee/goffee/docs/gaffer#create-new-project-using-gaffer)

Let's create a route that returns `hello world`

Open up the file `routes.go` in the root directory of your project and add the following code:
```go "defining a route"
	router.Get("/greeting", func(c *core.Context) *core.Response {
		JsonString := `{"message": "hello world"}`

		return c.Response.Json(JsonString)
	})
```
Next, in your terminal navigate to the project dir and run the following command to start the `live reloading`:
```go
goffee run:dev
```
Finally, open up your browser and navigate to `http://localhost/greeting`

To learn more check the [routing docs section](https://git.smarteching.com/goffee/goffee/docs/routing)


## Architecture
The architecture is similar to `MVC`, where there is a routes file `./routes.go` in which you can map all your app routes to their controllers which resides in the directory `./controllers`. Controllers are simply methods that handles requests (GET, POST, ... etch) to the given routes.

## The request journey:
The first component that receive's the request in `Cup` is the `Router`,
then `Goffee` locates the matching [handler](https://git.smarteching.com/goffee/docs/handlers) of the request and it check's if there are any [hooks](https://git.smarteching.com/goffee/docs/hooks) to be executed either before or after the [controller](https://git.smarteching.com/goffee/controllers), if so, it executes them in the right order, then at the final stage it returns the response to the user.
`Request -> Router -> Optional Hooks -> Controller -> Optional Hooks ->  Response`

## Folder structure 
```bash
├── cup
│   ├── config/ --------------------------> main configs
│   ├── events/ --------------------------> contains events
│   │   ├── jobs/ ------------------------> contains the event jobs
│   ├── controllers/ ---------------------> route's controllers
│   ├── logs/ ----------------------------> app log files
│   ├── hooks/ ---------------------------> app hooks
│   ├── models/ --------------------------> database models
│   ├── storage/ -------------------------> a place to store files
│   ├── tls/ -----------------------------> tls certificates
│   ├── .env -----------------------------> environment variables 
│   ├── .gitignore -----------------------> .gitignore
│   ├── go.mod ---------------------------> Go modules
│   ├── LICENSE --------------------------> license
│   ├── main.go --------------------------> go main file
│   ├── README.md ------------------------> readme file
│   ├── register-events.go ---------------> register events and jobs
│   ├── register-global-hooks.go ---------> register global middlewares
│   ├── routes.go ------------------------> app routes
│   ├── run-auto-migrations.go -----------> database migrations
```