# Use-Case
Standard pattern to be used to maintain the code scalability by providing
middleware-based flow. Each function can have its own middlewares for
pre- and post-processing.

According to the pattern above all of the case-functions runs only basic
rdbms operations, like getting data or writing data. And it's all based
on the data structure. The middlewares are used to for additional actions.

## How It's Done
The use-case is divided into at least 2 parts:
1. Case (`case.go`), where the `case` functions (the main functions) are stored
2. Tycovar (`tycovar.go`), where package scoped types, const, and variables
	are stored

Optionally, there can be other parts, such as:
1. Helper (`helper.go`), where internal functions are stored
2. Middleware (`middleware.go`), where the pre- and post-processing functions
	are stored

Then proceed the following steps (example):
1. Inside the `tycovar.go`, define the middleware types for each case
	functions. Make sure to:
	1. Include dto, table definition, and transaction for the parameters
		since the middlewares are to utilize or modifies one ot the parameters.
	2. Make all of the parameter pointer for easier handling.
	3. Return `error` for blocking purpose when error occurs.
	```go
	type createMw func(input *e.Createdto, tx *gorm.DB) error
	.
	.
	```
2. Inside the `tycovar.go`, create variables in form of array to make it 
	possible to have more than one middleware. There are 2 modes (pre- and
	post-processing) for each case functions:

	```go
	var createPreMw []createMw
	var createPostMw []createMw
	.
	.
	```
3. Inside the `middleware.go`, create the necessary middlewares  
	```go
	func createPreMwAddNamePrefix(input *e.Createdto, tx *gorm.DB) error {
		input.Name = "Prefix_" + input.Name
		return nil
	}
	```
4. Inside the `middleware.go`, append the middlewares during initialization.
	The order of the does not really is important, except there are steps that
	are dependent on each other.
	```go
	func init() {
		createPreMw = append(createPreMw, createPreMwAddNamePrefix)
	}
	```
5. Loop through the middleware variables and call each middleware. Since there
	are 2 modes (pre- and post-processing), the order of the calls is important.
